#include "dataexplorer.h"
#include "tablemodel.h"
#include <QTableView>
#include <QVBoxLayout>
#include <QSqlDatabase>
#include <QHeaderView>
#include <QMessageBox>
#include <QSqlError>
#include <QModelIndex>

DataExplorer::DataExplorer(QWidget *parent)
    : QWidget(parent)
    , m_tableView(nullptr)
    , m_tableModel(nullptr)
{
    setupUI();
}

void DataExplorer::setDatabase(const QSqlDatabase &db)
{
    m_database = db;
}

void DataExplorer::loadTable(const QString &tableName)
{
    if (!m_database.isOpen()) {
        QMessageBox::warning(this, tr("Error"), tr("No database connection"));
        return;
    }
    
    if (!m_tableModel) {
        m_tableModel = new TableModel(this, m_database);
        m_tableView->setModel(m_tableModel);
    } else {
        m_tableModel->setDatabase(m_database);
    }
    
    m_tableModel->setTable(tableName);
    m_tableModel->select();
    
    if (m_tableModel->lastError().isValid()) {
        QMessageBox::warning(this, tr("Error"), 
                            tr("Failed to load table: %1").arg(m_tableModel->lastError().text()));
        return;
    }
    
    m_currentTable = tableName;
    emit tableLoaded(tableName);
    
    // 设置表格属性
    m_tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    m_tableView->setSelectionMode(QAbstractItemView::SingleSelection);
    m_tableView->setAlternatingRowColors(true);
    m_tableView->horizontalHeader()->setStretchLastSection(true);
    m_tableView->verticalHeader()->setVisible(false);
}

void DataExplorer::refresh()
{
    if (m_tableModel && !m_currentTable.isEmpty()) {
        m_tableModel->select();
    }
}

TableModel* DataExplorer::getModel() const
{
    return m_tableModel;
}

void DataExplorer::onSelectionChanged()
{
    // 处理选择变化事件
}

void DataExplorer::setupUI()
{
    QVBoxLayout *layout = new QVBoxLayout(this);
    layout->setContentsMargins(0, 0, 0, 0);
    
    m_tableView = new QTableView;
    layout->addWidget(m_tableView);
    
    connect(m_tableView->selectionModel(), &QItemSelectionModel::selectionChanged,
            this, &DataExplorer::onSelectionChanged);
}